05 - ANOVA

Auswertung Emprischer Daten

Prof. Dr. David F. Urschler

Welche ANOVAs kennen wir?

  • einfaktorielle ANOVA

  • mehrfaktorielle ANOVA

  • einfaktorielle ANOVA mit Messwiederholung

  • mehrfakotirelle ANOVA mit Messwiederholung

einfaktorielle ANOVA

Welche Fragen können wir beantworten?

Über die Psychologie hinaus

  • Sind unterschiedliche Prduduktionslinien unterschiedlich produktiv?

  • Gibt es Unterschiede in der Pünktlichkeit von Flügen in der EU?

  • Haben Menschen Präferenzen für einen bestimmten Humor?

einfaktorielle ANOVA

Welche Fragen können wir beantworten?

In der Psychologie

  • Wie wirken unterschiedliche Beleuchtungen auf unsere Stimmung?

  • Unterscheiden sich Psychologinnen von anderen Disziplinen?

  • Wie wirken unterschiedliche LVs auf Studierende?

einfaktorielle ANOVA

Vorgehensweise

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

einfaktorielle ANOVA

Beispiel

Hat die Social-Media-Plattformen einen Einfluss auf die Wahrnehmung des Inhalts?



einfaktorielle ANOVA

Beispiel

Hat die Social-Media-Plattformen einen Einfluss auf die Wahrnehmung des Inhalts?

Warum nicht mehrere t-Tests für unabhängige Stichproben?

  • Anzahl der durchzuführenden t-Tests steigt mit den k Ausprägungen

\[ \begin{aligned} \ j &= \frac{k \cdot (k - 1)}{2} \\ \\ \ j &= \frac{3 \cdot (3 - 1)}{2} \\ \ j &= 3 \\ \end{aligned} \]

einfaktorielle ANOVA

Beispiel

Hat die Social-Media-Plattformen einen Einfluss auf die Wahrnehmung des Inhalts?

Warum nicht mehrere t-Tests für unabhängige Stichproben?

  • Mit der Anzahl der durchzuführenden t-Tests steigt steigt der ⍺-Fehler

\[ \begin{aligned} \ \alpha_{kum} &= 1 - (1 - \alpha)^j \\ \\ \ \alpha_{kum} &= 1 - (1 - .05)^3 \\ \ \alpha_{kum} &= .1426 \\ \ \alpha_{kum} &= 14.26 \% \\ \end{aligned} \]

einfaktorielle ANOVA

Beispiel

Informationen zum Datensatz ae_anova_one_way.csv

  • demographische Daten (id, age & gen: 0 = weiblich, 1 = männlich)
  • Social-Media-Plattform (smp: 0 = “TikTok”, 1 = “Twitch”, 2 = “Instagram”)
  • Bewertung der Inhalte über drei Items (0 = trifft nicht zu, 7 = trifft voll zu)

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style A fill: #009e73

einfaktorielle ANOVA

Beispiel

Daten einlesen

Zeig mir den Code
ds <- read.csv(here::here("ae_anova_one_way.csv"),
               header = TRUE)

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style B fill: #009e73

einfaktorielle ANOVA

Beispiel

Übersicht verschaffen



id age gen smp Bew.01 bew_02 BEW.03
1 47 1 2 7 7 7
2 48 1 2 7 7 5
3 33 1 2 6 5 6
4 43 1 2 7 7 7
5 22 0 2 5 5 5
6 43 1 2 4 7 5

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style C fill: #009e73

einfaktorielle ANOVA

Beispiel

Namen brauchbar machen

  • händisch mit der rename()-Funktion aus dem tidyverse-Package
Zeig mir den Code
ds |> 
  rename(bew_01 = Bew.01,
         bew_02 = bew_02,
         bew_03 = BEW.03)
  • “bequemer” mit der clean_names()-Funktion aus dem janitor-Package
Zeig mir den Code
ds <- ds |> 
  janitor::clean_names()
id age gen smp bew_01 bew_02 bew_03
1 47 1 2 7 7 7
2 48 1 2 7 7 5

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style D fill: #009e73

einfaktorielle ANOVA

Beispiel

Ergeben die Daten Sinn?

Zeig mir den Code
summary(ds)

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style E fill: #009e73

einfaktorielle ANOVA

Beispiel

Skalenwerte berechnen

  • Gender-Variable als Faktor-Variable
Zeig mir den Code
ds$gen_f <- factor(ds$gen,
                   levels = c(0, 1),
                   labels = c("w", "m"))
  • Social-Media-Variable als Faktor-Variable
Zeig mir den Code
ds$smp_f <- factor(ds$smp,
                   levels = c(0, 1, 2),
                   labels = c("Tik_Tok", "Twitch", "Insta"))

einfaktorielle ANOVA

Beispiel

Skalenwerte berechnen

  • Funktioniert unsere AV?
Zeig mir den Code
ds |> 
  select(starts_with("bew")) |> 
  psych::alpha()

# Oder wir erstellen ein neues Objekt

ca <- ds |> 
  select(c("bew_01", "bew_02", "bew_03"))

psych::alpha(ca)

einfaktorielle ANOVA

Beispiel

Skalenwerte berechnen

  • Funktioniert unsere AV? ➜ Wie gut ist das Cronbach’s-⍺?

Reliability analysis   
Call: psych::alpha(x = ca)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
      0.81      0.81    0.74      0.58 4.2 0.018  5.6 1.2     0.57

    95% confidence boundaries 
         lower alpha upper
Feldt     0.77  0.81  0.84
Duhachek  0.77  0.81  0.84

 Reliability if an item is dropped:
       raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
bew_01      0.69      0.69    0.53      0.53 2.3    0.033    NA  0.53
bew_02      0.78      0.78    0.64      0.64 3.6    0.023    NA  0.64
bew_03      0.72      0.72    0.57      0.57 2.6    0.030    NA  0.57

 Item statistics 
         n raw.r std.r r.cor r.drop mean  sd
bew_01 346  0.87  0.87  0.78   0.69  5.6 1.4
bew_02 346  0.82  0.82  0.67   0.61  5.9 1.4
bew_03 346  0.86  0.85  0.74   0.66  5.4 1.5

Non missing response frequency for each item
          0    1    2    3    4    5    6    7 miss
bew_01 0.01 0.01 0.02 0.06 0.10 0.18 0.30 0.32    0
bew_02 0.00 0.01 0.03 0.05 0.07 0.15 0.22 0.47    0
bew_03 0.00 0.03 0.02 0.06 0.12 0.25 0.25 0.27    0

einfaktorielle ANOVA

Beispiel

Skalenwerte berechnen

Wie wird der Inhalt bewertet?

Zeig mir den Code
ds <- ds |> 
  rowwise() |> # führt dazu, dass die folgenden Funktionen zeilenweise ausgeführt werden
  mutate(bw_mean = mean(c(bew_01, bew_02, bew_03),
                        na.rm = TRUE))  

# Alternative mit "rowMeans()"

ds$bw_mean <- rowMeans(ds[c("bew_01", "bew_02", "bew_03")],
                       na.rm = TRUE)

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style F fill: #009e73

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

Voraussetzungen

  • Skalenniveau
  • Unabhängigkeit der Messungen
  • Varianzhomogenität
  • Normalverteilung

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

Voraussetzungen - Varianzhomogenität

Levene's Test for Homogeneity of Variance (center = median)
       Df F value   Pr(>F)   
group   2  5.7298 0.003567 **
      343                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1



Die Varianzhomogenität ist verletzt ➜ Was nun?

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

Voraussetzungen - Normalverteilung



Achtung

Die Daten in den einzelnen Bedingungen müssen normalverteilt sein!
Es muss keine Normalverteilung über die gesamten Daten vorliegen!

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

Wir rechnen trotzdem, da die ANOVA robust ist, vor allem bei großen Stichproben!

ANOVA

Hierfür nutzen wir die Anova()-Funktionaus dem car-Package

Zeig mir den Code
# Wir müssen zunächst ein Regressionsobjekt erstellen
mod_anova <- lm(bw_mean ~ smp_f,
                data = ds)

## Wir brauchen Typ III Sum of Squares 
mod_III <- car::Anova(mod = mod_anova,
                      type = 3)

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

ANOVA

Anova Table (Type III tests)

Response: bw_mean
             Sum Sq  Df  F value    Pr(>F)    
(Intercept) 2848.40   1 2162.011 < 2.2e-16 ***
smp_f         71.03   2   26.955  1.34e-11 ***
Residuals    451.89 343                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

Effektstärke

Zeig mir den Code
effectsize::eta_squared(mod_III)

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

Effektstärke

# Effect Size for ANOVA

Parameter | Eta2 |       95% CI
-------------------------------
smp_f     | 0.14 | [0.08, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

post-hoc-Tests

  • Bonferroni-Korrektur
  • Bonferroni-Holms
  • Sidak
  • Scheffe
  • R-E-G-W F
  • R-E-G-W Q
  • Tukey (HSD)

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

post-hoc-Test - Tukey-HSD-Test

Hierfür nutzen wir die emmeans()-Funktionaus dem emmeans-Package

Zeig mir den Code
# Wir erstellen zunächst ein neues Objekt namens "post" für post-hoc-Test
post <- emmeans::emmeans(mod_anova, # Das "mod_anova"-Objekt haben wir bereits erstellt
                            ~ smp_f) # Hier müssen wir nochmals spezifizieren, welche Ausprägungen miteinander verglichen werden sollen ... warum auch immer

pairs(post, adjust = "tukey" )

einfaktorielle ANOVA

Beispiel

einfaktorielle ANOVA berechnen

post-hoc-Test - Tukey-HSD-Test

 contrast         estimate    SE  df t.ratio p.value
 Tik_Tok - Twitch   -1.041 0.153 343  -6.817  <.0001
 Tik_Tok - Insta    -0.865 0.150 343  -5.774  <.0001
 Twitch - Insta      0.176 0.151 343   1.167  0.4739

P value adjustment: tukey method for comparing a family of 3 estimates 

einfaktorielle ANOVA

Beispiel

flowchart TB

A(Daten einlesen) --> 
B(Übersicht verschaffen) --> 
C(Namen brauchbar machen) --> 
D(Ergeben die Daten Sinn?) --> 
E(Skalenwerte berechnen) --> 
F(einfaktorielle ANOVA) --> 
G(Ergebnis berichten)

style G fill: #009e73

einfaktorielle ANOVA

Beispiel

Ergebnis berichten

Deskriptiven Daten

Zeig mir den Code
ds |> 
  group_by(smp_f) |> 
  summarize(Mittelwert = mean(bw_mean,
                              na.rm = TRUE),
            Standardabweichung = sd(bw_mean,
                              na.rm = TRUE))

einfaktorielle ANOVA

Beispiel

Ergebnis berichten

Deskriptiven Daten

smp_f Mittelwert Standardabweichung
Tik_Tok 4.976812 1.348396
Twitch 6.018018 1.017859
Insta 5.841667 1.047840

einfaktorielle ANOVA

Beispiel

Ergebnis berichten

APA-konform

“Eine einfaktorielle ANOVA wurde durchgeführt um zu testen, ob die Wahl der Social-Media-Plattform eine Auswikrung auf die Wahrnehmung des Inhalts hat. Die Ergebnisse zeigen, dass die Social-Media-Plattform eine Auswikrung auf die Wahrnehmung des Inhalts hat, F(2, 343) = 26.95, p < .001, η² = 0.14, 95% CI [0.08, 1.00].
Der Tukey post-hoc Test zeigte einen signifikanten Unterschied zwischen Tik-Tok (M = 4.98, SD = 1.35) und Twitch (M = 6.02, SD = 1.02), p < .001. Zusätzlich zeigtes sich ein signifikanter Unterschied zwischen Tik-Tok und Instagram (M = 5.84, SD = 1.05), p < .001. Der Unterschied zwischen Twitch und Instagram war nich signifikant, p = 474.”

einfaktorielle ANOVA

Beispiel

Ergebnis berichten

Balkendiagram

einfaktorielle ANOVA

Beispiel

Ergebnis berichten

Balkendiagram

Zeig mir den Code
# Welche Farbe hätte ich denn gerne``
mf <- c("#00AFBB", "#E7B800", "#FC4E07")

# Erstellen des Plots
ds |> 
  ggplot(aes(x = smp_f,
             y = bw_mean,
             fill = smp_f)) +
  stat_summary(fun = "mean" ,         # "stat_summary" - erledig die Arbeit für uns - Mittelwert zu plotten
               geom = "bar",          # Wir hätten gerne Balken
               show.legend = FALSE) + # Wir brauchen keine Legende
  scale_y_continuous(limits = c(0, 7),
                     breaks = c(0:7)) +
  scale_fill_manual(values = mf) +
  labs(x = "",
       y = "Bewertung") +
  theme_classic()

einfaktorielle ANOVA

Beispiel

Ergebnis berichten

Violinplot

einfaktorielle ANOVA

Übung




Durchlaufen Sie sämtliche Schritte mit dem Alter der Versuchspersonen als AV!